package com.wl2o2o.javau8g;

import com.wl2o2o.leetcode.ListNode;

import java.util.HashSet;

/**
 * hashSet去重错误代码示范
 * @Author <a href="https://github.com/wl2o2o">程序员CSGUIDER</a>
 * @From <a href="https://wl2o2o.github.io">CSGUIDER博客</a>
 * @CreateTime 2024/4/21
 */

public class HashSetDeduplication {
    public static void main(String[] args) {
        HashSet<ListNode> set = new HashSet<>();
        int[] nums = {3, 2, 0, 0, 2, 3};
        ListNode head;
        for (int i = 0; i <nums.length; i++) {
            head = new ListNode(nums[i]);
            set.add(head);
            head = head.next;
        }


        for (ListNode o : set) {
            // 遍历set
            System.out.println(o.val);
        }

    }

    /**
     * 原因讲解：
     * 因为我们的 ListNode 自定义类的去重是通过 hashCode() 和 equals() 来进行比较的，我们没有对齐进行重写，
     * 并且在迭代过程中，我们始终创建了一个新的 new ListNode(nums[i]);
     * 所以，我们每次迭代都会创建一个新的对象，导致 hashSet 无法去重。
     *
     * 解决方法：
     * 重写自定义类中的 hashCode() 和 equals() 方法，让 hashSet 可以根据自定义类的属性进行去重。
     */
    // public class ListNode {
    //     public int val;
    //     public com.wl2o2o.leetcode.ListNode next;
    //
    //     public ListNode(int x) {
    //         val = x;
    //         next = null;
    //     }
    //     // 重写hashCode()方法，基于节点值计算哈希码
    //     @Override
    //     public int hashCode() {
    //         return Integer.hashCode(val);
    //     }
    //
    //     // 重写equals()方法，基于节点值判断相等性
    //     @Override
    //     public boolean equals(Object obj) {
    //         if (this == obj) {
    //             return true;
    //         }
    //         if (!(obj instanceof com.wl2o2o.leetcode.ListNode)) {
    //             return false;
    //         }
    //         com.wl2o2o.leetcode.ListNode other = (com.wl2o2o.leetcode.ListNode) obj;
    //         return val == other.val;
    //     }
    //
    // }


}